#include "sublogic.h"

/*
    打印消息结构
*/
void printMsg(msgdata* msg){
    printf("_act: %d \n",msg->_act);
    printf("_acc: %s \n",msg->_acc);
    printf("_pwd: %s \n",msg->_pwd);
    printf("_isgroup: %d \n",msg->_isgroup);
    printf("_cancalstatue: %d \n",msg->_cancalstatue);
    printf("_who: %s \n",msg->_who);
    printf("_msg: %s \n",msg->_msg);
}


/*
    删除字符串的回车符
*/
void eraseStr_n(char* buf)
{
    char* p = buf;
    while(*p != '\n')	p++;
    *p = '\0';
}

/*
    打印时间戳
*/
char* printTime()
{
    time_t t;
    time(&t);               // 取得当前时间
    char* str = ctime(&t);  // 将日期转化为字符串格式
    eraseStr_n(str);
//    printf("%s\n",str);
    return str;
}


/*
    注册、登录服务器 - 向服务器提交表单
        input : isLogin - true : 登陆 ； false ： 注册
*/
void login(bool isLogin)
{
    char temp[USER_ACCOUNT];
    msgdata msg;

    if(isLogin) msg._act = _Login;
    else        msg._act = _Logon;

    printf("> please input acc (length < 20): ");Gets(temp);

    // acc format check
    while(strlen(temp) > USER_ACCOUNT)
    {
        printf("# pwd format error\n");
        Gets(temp);
    }
    strcpy(msg._acc,temp);

    printf("> please input pwd (length < 20): ");Gets(temp);

    // pwd format check
    while(strlen(temp) > USER_ACCOUNT){
        printf("# pwd format error\n");
        Gets(temp);
    }
    strcpy(msg._pwd,temp);

//    printMsg(&msg);
    // 发送给服务器进行验证
    Write(_sockfd, &msg, sizeof(msgdata));
}

/*
    登录窗口
*/
void LoginWidget()
{
    int no = '0'; // 用户输入功能编号
    _isLoginFlag = false; // 登陆状态

    // 功能选择
    printf("  ### 1. Logon\n");
    printf("  ### 2. Login\n");
    printf("  ### 3. Exit\n");

    // 功能编号输入错误
    while(no != '1' && no != '2' && no != '3')
    {
        printf("> please input no.: ");
        no = getchar();
        getchar(); // 接受回车
    }

    // 执行相应功能
    switch(no)
    {
        case '1': login(false); break;
        case '2': login(true);  break;
        case '3': exit(0); break;
        default: break;
    }
}


/*
    保存聊天记录到缓冲区
*/
void saveChatRecord(char* sender,char* receiver,char* msgcontent)
{
    static i = 0;
    // 缓冲区满了，写到 ‘数据库’
    if(i == CHAT_RECORDS)
    {
        // 将缓冲区聊天记录写入文件
        chatRecordTofile();
        i = 0;
    }

    // 构造一条聊天记录
    Achat* record = Malloc(sizeof(Achat));
    strcpy(record->_sender,sender);
    strcpy(record->_receiver,receiver);
    strcpy(record->_msgcontent,msgcontent);
    strcpy(record->_time,printTime());

    // 保存到缓冲区
    chatRecordList[i++] = record;
//    printf("# add a chat record\n");
}

/*
    将缓冲区聊天记录写入文件
*/
void chatRecordTofile()
{
    // 打开文件
    FILE* fp = fopen(CHAT_DATABASE,"a+");
    if(fp == NULL)
    {
        perror("fopen error!");
        exit(0);
    }

    // 遍历聊天记录缓冲表，依次写到数据库文件
    int j = 0;
    while(j < CHAT_RECORDS && chatRecordList[j] != NULL)
    {
        Fputs(chatRecordList[j]->_time,fp);
        Fputs("\t",fp);
        Fputs(chatRecordList[j]->_sender,fp);
        Fputs("\t",fp);
        Fputs(chatRecordList[j]->_receiver,fp);
        Fputs("\t",fp);
        Fputs(chatRecordList[j]->_msgcontent,fp);
        Fputs("\n",fp);
        j++;
    }
    fclose(fp);
    printf("\n# add %d chat record to file\n",j);
    // 重置缓冲区
    for(j = 0;j < CHAT_RECORDS;j++)
    {
        free(chatRecordList[j]);
        chatRecordList[j] = NULL;
    }
}

/*
    查看聊天记录
*/
void PrintchatRecord(char* who)
{
    // 打开文件
    FILE* fp = fopen(CHAT_DATABASE,"r");
    if(fp == NULL)
    {
        perror("fopen error!");
        exit(0);
    }

    // 筛选与 `who` 的聊天记录要
    char a_chat[ACHAT_LENGTH];    // 保存一条用户信息
    char temp_time[TIME_FORMAT];
    char temp_acc[USER_ACCOUNT];
    char temp_who[USER_ACCOUNT];

    printf("# show chat record with %s:\n",who);
    // 遍历数据库文件
    while(Fgets(a_chat,ACHAT_LENGTH,fp) != NULL)
    {
        sscanf (a_chat,"%24c\t%s\t%s",temp_time,temp_acc,temp_who);
        if((strcmp(temp_acc,_myacc)==0 && strcmp(temp_who,who)==0) ||
           (strcmp(temp_acc,who)==0 && strcmp(temp_who,_myacc)==0))
        {
            eraseStr_n(a_chat);
            printf("# %s\n",a_chat);
        }
    }
    fclose(fp);
}
